//
//  NSObject+KVO.m
//  03-响应式编程思想
//
//  Created by J on 16/2/18.
//  Copyright © 2016年 J. All rights reserved.
//

#import "NSObject+KVO.h"
#import <objc/runtime.h>
#import "XMGKVONotifying_Person.h"

@implementation NSObject (KVO)
- (void)xmgAddObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context{
    
    //KVO底层实现:
    //1.运行时动态创建NSKVONotifying_Person,NSKVONotifying_Person是Person子类做KVO
    //2.修改当前对象的isa指针 isa	-> NSKVONotifying_Person(NSKVONotifying_(+类名))
    //3.只要调用对象的set方法就会调用NSKVONotifying_Person的set方法
    //4.重写NSKVONotifying_Person的set方法1.[super set:]2.通知观察者属性值改变
    //就是判断有没有调用一个对象的set方法
    
    //修改isa指针 本质运行时修改当前对象的类名
    object_setClass(self, [XMGKVONotifying_Person class]);
    //把观察者保存到当前对象里
    
    
    //添加关联 动态生成一个属性
    //<#id object#> 给哪个对象添加关联属性
    //<#const void *key#> 属性名
    //<#id value#>关联值
    //<#objc_AssociationPolicy policy#>策略
    objc_setAssociatedObject(self,@"observer" , observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    
    
    
    
    
    
}

@end
